<template>
	<view class="content">
		<view class="">
			<button type="default" @tap="btn()">扫描设备</button>
		</view>
		
		<!-- 扫描出来的设备列表 -->
		<view class="list">
			<view class="list-one" v-for="(i,j) in lists" :key="j" @tap="connect(i[1])">
				{{i[0]}}
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				list:[],
				lists:[],
				deviceId: '',
				serviceId: '',
			}
		},
		onLoad() {
			this.openPhoneBluetooth()
		},
		methods: {
			// 验证是什么平台的，调用打开蓝牙
			openPhoneBluetooth(){
				var main,BluetoothAdapter,BAdapter;
				switch (uni.getSystemInfoSync().platform) {  
				    case "android":  
				        // Android平台: plus.android.*  
						console.log("运行在android")
				        main = plus.android.runtimeMainActivity();
						BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
						BAdapter = BluetoothAdapter.getDefaultAdapter()
						if(!BAdapter.isEnabled()){
							BAdapter.enable()
						}
				        break;  
				    case "ios":  
				        // iOS平台: plus.ios.*  
						console.log("运行在ios")
				        break;  
				    default:  
				        // 其它平台 
						 console.log("运行在其他平台")
				        break;  
				}
			},
			
			// 点击扫描设备
			btn(){
				var _this = this
				//在页面加载时候初始化蓝牙适配器
				uni.openBluetoothAdapter({
					success:(res)=> { //已打开
						this.jiazai = true
						uni.getBluetoothAdapterState({//蓝牙的匹配状态
							success:(res1)=>{
								console.log(res1,'“本机设备的蓝牙已打开”')
								
								// 开始搜索蓝牙设备
								this.startBluetoothDeviceDiscovery()
								
							},
							fail(error) {
								uni.showToast({icon:'none',title: '查看手机蓝牙是否打开'});
							}
						})
					}, 
					fail:err=>{ //未打开 
						uni.showToast({icon:'none',title: '查看手机蓝牙是否打开'});
						
					}
				})
			},
			
			// 开始搜索蓝牙设备
			startBluetoothDeviceDiscovery(){
				uni.startBluetoothDevicesDiscovery({
					allowDuplicatesKey: true,
					success: (res) => {
						console.log('startBluetoothDevicesDiscovery success', res)
						
						// 发现外围设备
						this.onBluetoothDeviceFound()
					},fail:err=>{
						console.log(err,'错误信息')
					}
				})
			},

			// 发现外围设备
			onBluetoothDeviceFound() {
				// console.log("zhixing")
				uni.onBluetoothDeviceFound((res) => {
					// console.log(res)
					// console.log(res.devices)
					// console.log(res.devices[0])
					// console.log(res.devices[0].name)
					if(this.list.indexOf(res.devices[0].deviceId)==-1){
						console.log(res.devices[0].deviceId)
						this.list.push(res.devices[0].deviceId)
						if(res.devices[0].name!=""){
							if(res.devices[0].name.indexOf("Scooter") != -1){
								this.lists.push([res.devices[0].name,res.devices[0].deviceId])
							}
							
						}
						console.log(res.devices[0].name)
						console.log(this.lists)
						
					}
				})
			},
			
			//点击连接
			connect(deviceId){
				let thit = this
				
				//连接蓝牙
				this.deviceId = deviceId
				uni.createBLEConnection({
					
				  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
				  // 传入res.devices[0].deviceId
				  deviceId:this.deviceId,
				  success(res) {
					thit.stopBluetoothDevicesDiscovery()
					console.log(res)
					console.log("蓝牙连接成功")
					uni.showToast({
						title: '蓝牙连接成功'
					});
					
					thit.getBLEDeviceServices();
					
				  },fail(res) {
					console.log("错误",res)
					console.log("蓝牙连接失败")
				  }
				})
				
			},
			// 停止搜寻蓝牙设备
			stopBluetoothDevicesDiscovery(){ 
				uni.stopBluetoothDevicesDiscovery({ 
					success: e => {
						this.jiazai = false
						console.log("断开成功")
						console.log('停止搜索蓝牙设备:' + e.errMsg); 
					},
					fail: e => {
						console.log("断开失败")
						console.log('停止搜索蓝牙设备失败，错误码：' + e.errCode);
					}
				});
			},
			
			//获取蓝牙的所有服务
			getBLEDeviceServices(){
				setTimeout(()=>{
					uni.getBLEDeviceServices({
					  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
					  deviceId:this.deviceId,
					  success:(res)=>{
						//res.services[1].uuid
						console.log("成功",res)
						console.log('device services:', res)
						console.log(res.services)
						let uuid = res.services.map(i=>i.uuid)
						console.log(uuid)
						
						if(!uuid.includes("00008880-7777-EFDE-1523-785FEABCD123")){
							uni.showToast({
								icon:"none",
								title: '请连接对应的设备'
							});
							this.disconnect();
						}
						res.services.forEach((item)=>{
							
							if(item.uuid.indexOf("8880")!=-1){
								this.serviceId = item.uuid
								console.log(this.serviceId)
								// 必须在这里的回调才能获取
								uni.onBLECharacteristicValueChange((res)=>{
									console.log("监听成功",res)
									
								})
								//获取意外断开蓝牙
								uni.onBLEConnectionStateChange((res)=>{
								  // 该方法回调中可以用于处理连接意外断开等异常情况
								  console.log("监听到的状态")
								  console.log(res)
								  if(res.connected==false){
								  	clearInterval(this.time)
								  	uni.showToast({
								  		icon:"none",
								  		title: '蓝牙连接已断开'
								  	});
								  	
								  }
								  
								  console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
								})
								
								this.getBLEDeviceCharacteristics()
							}
						})
					  }
					})
				},1000)
			},
			
			//获取蓝牙特征
			getBLEDeviceCharacteristics(){
				console.log("进入特征");
				setTimeout(()=>{
					uni.getBLEDeviceCharacteristics({
					  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
					  deviceId:this.deviceId,
					  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
					  serviceId:this.serviceId,
					  success:(res)=>{
						console.log(res,'getBLEDeviceCharacteristics')
						this.characteristics = res.characteristics
						this.$store.commit("chara",res.characteristics)
						console.log(this.characteristics)
						console.log(this.characteristics[0].uuid)
						
						res.characteristics.forEach((item)=>{
							// if(item.uuid.indexOf("8882") != -1){
								console.log('characteristicId:', item.uuid)
								this.notifyBLECharacteristicValueChange(item.uuid)
							// }
						})
						
					  },
					  fail:(res)=>{
						console.log(res)
					  }
					})
				},1000)
			},
			
			// 启用 notify 功能
			notifyBLECharacteristicValueChange(characteristicId){
				console.log(characteristicId,'characteristicId')
				uni.notifyBLECharacteristicValueChange({
				  state: true, // 启用 notify 功能
				  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
				  deviceId:this.deviceId,
				  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
				  serviceId:this.serviceId,
				  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
				  characteristicId:characteristicId,
				  success:(res)=> {
					console.log(res)
					// console.log(this.characteristicId)
					// console.log('notifyBLECharacteristicValueChange success', res.errMsg)
					console.log("开启成功了，准备开始读取",characteristicId)
					

					if(characteristicId.indexOf("8883") != -1){
						setTimeout(()=>{
							console.log("读的uuid为"+characteristicId)
							uni.readBLECharacteristicValue({
							  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
							  deviceId:this.deviceId,
							  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
							  serviceId:this.serviceId,
							  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
							  characteristicId:characteristicId,
							  success:(res)=> {
								console.log("读取成功")
								console.log("这里读到的蓝牙uuid是"+characteristicId)
								
								console.log('readBLECharacteristicValue:', res)
							  },
							  fail:(res)=> {
								  console.log("读取失败"+characteristicId)
								 console.log('readBLECharacteristicValue:', res)
							  }
							})
						},900)
						
					}else if(characteristicId.indexOf("8881") != -1){
						
						setTimeout(()=>{
							console.log("读的uuid为"+characteristicId)
							uni.readBLECharacteristicValue({
							  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
							  deviceId:this.deviceId,
							  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
							  serviceId:this.serviceId,
							  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
							  characteristicId:characteristicId,
							  success:(res)=> {
								console.log("读取成功")
								console.log("这里读到的蓝牙uuid是"+characteristicId)
								
								console.log('readBLECharacteristicValue:', res)
							  },
							  fail:(res)=> {
								  console.log("读取失败"+characteristicId)
								 console.log('readBLECharacteristicValue:', res)
							  }
							})
						},800)
					}else{
						clearInterval(this.time)
						this.time = setInterval(()=>{
							uni.readBLECharacteristicValue({
							  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
							  deviceId:this.deviceId,
							  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
							  serviceId:this.serviceId,
							  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
							  characteristicId:characteristicId,
							  success:(res)=> {
								console.log("读取成功222")
								// console.log("这里读到的蓝牙uuid是"+characteristicId)
								
								// console.log('readBLECharacteristicValue:', res)
							  },
							  fail:(res)=> {
								  console.log("读取失败"+characteristicId)
								 console.log('readBLECharacteristicValue:', res)
							  }
							})
						},1000)
					}
				  },
				  fail:(res)=> {
					console.log('notifyBLECharacteristicValueChange success2', res.errMsg)
				  }
				})
				
			},
			
			// 写入数据，16进制的
			writeBLECharacteristicValue(e){
				let thit = this
				let stconf = "000"
				var hex = stconf.join("")
				console.log(hex)
				var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
				  return parseInt(h, 16)
				}))
				
				var buffer = typedArray.buffer
				uni.writeBLECharacteristicValue({
				  // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
				  deviceId:this.deviceId,
				  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
				  serviceId:this.serviceId,
				  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
				  characteristicId:this.characteristics[0].uuid,
				  // 这里的value是ArrayBuffer类型
				  value: buffer,
				  success(res) {
				    console.log('writeBLECharacteristicValue success', res.errMsg)
					console.log("写入成功")
				  },
				  fail(res) {
					console.log("写入失败",res)
					// 重新写入一次
					setTimeout(()=>{
						thit.writeBLECharacteristicValue(e)
					},100)
				  }
				})
			},
			
			//断开蓝牙连接
			disconnect(){
				uni.closeBLEConnection({
				  deviceId:this.deviceId,
				  success(res) {
				    console.log(res)
				  }
				})
			},
		}
	}
</script>

<style>
	.list{
		height: 500rpx;
		overflow-y: scroll ;
		background: #fff;
		border-radius: 10rpx;
		margin: 20rpx;
		margin-top: 155rpx;
		.list-one{
			padding: 0 28rpx;
			border-bottom:1px solid #E6E6E6 ;
			height:105rpx ;
			line-height: 105rpx;
			font-size: 30rpx;
			color: #333333;
		}
		.list-one:last-child{
			border: none;
		}
		.list-one:active{
			background: #CCCCCC;
		}
	}
</style>
